home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Mops 2.7 / Mops source / Asm Source / AsmUtilities < prev    next >
Text File  |  1993-07-25  |  4KB  |  154 lines

  1. \ Assembler Utility Routines        Reese Warner                4/85
  2. \  09/10/85  RW   Changed auxA/D: to A/D:
  3. \  09/16/85  RW   Made >num copy out its number
  4. \  03/06/86  GDC  fixed immediate mode (>num)
  5. \  03/07/86  GDC  fixed PC modes (9 & 10) (compIdxMode) 
  6. \ 10-May-87  MRH  added range checking, and error messages in English
  7.  
  8. 0 -> dlevel
  9.  
  10. objPtr    OPPTR    class_is operand
  11.  
  12.  
  13. : >NUM  { addr len \ neg? -- n }        \  converts text into numbers
  14.  
  15.     addr c@  & $  =
  16.     if  1 ++> addr  1 --> len   hex  then
  17.     addr c@  & -  =  dup -> neg?  if  1 ++> addr  1 --> len  then
  18.     0 0  addr len  >number  2drop drop  decimal
  19.     neg? +-  ;
  20.  
  21.  
  22. : ASMERROR  { errNum -- }
  23.     cr ." asmerror# " errNum . ." in Line number  " linect . cr
  24.     tib tiblen type cr
  25.     pos spaces  & ^ emit  cr
  26.     errNum
  27.     CASE
  28.         200    OF    ." Error in loading AsmCodes"        ENDOF
  29.         202    OF    ." Bad operation size/format"        ENDOF
  30.         203    OF    ." Bad operand"                ENDOF
  31.         205    OF    ." Bad immediate operand"        ENDOF
  32.         206    OF    ." Error in loading Operands"        ENDOF
  33.         207    OF    ." Operand modes do not match"        ENDOF
  34.         208    OF    ." Operand not an address register"    ENDOF
  35.         210    OF    ." Bad register mask"            ENDOF
  36.         211    OF    ." Error in first pass"            ENDOF
  37.         216    OF    ." Object or word not in dictionary"    ENDOF
  38.         217    OF    ." Reserved word not followed by ["    ENDOF
  39.         219    OF    ." Register direct operand needed"    ENDOF
  40.         245    OF    ." Wrong mode for this instruction"    ENDOF
  41.         246    OF    ." Short absolute addr out of range"    ENDOF
  42.         247    OF    ." Byte displacement out of range"    ENDOF
  43.         248    OF    ." Word displacement out of range"    ENDOF
  44.         249    OF    ." Immediate operand too large"        ENDOF
  45.         250    OF    ." Branch out of range"            ENDOF
  46.         251    OF    ." Undefined label"            ENDOF
  47.         252    OF    ." Bad instruction mnemonic"        ENDOF
  48.         253    OF    ." Label already defined"        ENDOF
  49.         254    OF    ." Operand must be a number only"    ENDOF
  50.         255    OF    ." Wrong operand type for this instruction"
  51.                                     ENDOF
  52.     ENDCASE
  53.     cr abort  ;        \ Added abort so the "real" error doesn't
  54.                 \ scroll off the screen!
  55.  
  56. : INRANGE?
  57.     within?  nip  ;
  58.  
  59. : WORDCHK  { n err# -- n }
  60.     n  -32768
  61.     err# 249 =  IF  $ FFFF  ELSE  $ 7FFF  THEN
  62.     inRange?  NIF  err# asmError  THEN
  63.     n  $ FFFF and  ;
  64.  
  65. : BYTECHK  { n err# -- n }
  66.     n  -128  err# 249 =  IF  $ FF  ELSE  $ 7F  THEN
  67.     inRange? not  IF  err# asmError  THEN
  68.     n  $ FF and  ;
  69.     
  70.  
  71. : doneon null ;
  72.  
  73. : CHECK { opPtr mask -- }
  74.     1
  75.     opPtr mode: operand    val" mode is" 
  76.     <<
  77.     mask            val" mask is " 
  78.     and
  79.     NIF
  80.         245 asmError        \ mode and mask do not match
  81.     THEN  ;
  82.  
  83.  
  84. : COMPIDXMODE        \ ( opPtr -- )
  85.     -> opPtr
  86.     getpcmode: opPtr  dup 8 <
  87.     IF  drop  mode: opPtr  THEN
  88.  
  89.     SELECT{
  90.  
  91.     AnRelMode IS{
  92.         value: opPtr  248 wordChk  w,            }END
  93.     IndexMode IS{
  94.         value: opPtr  247 byteChk
  95.         auxilSize: opPtr 1- 11 << or
  96.         auxReg: opPtr 12 << or
  97.         A/D: opPtr 15 << or
  98.         w,                        }END
  99.     ShortAbsMode IS{
  100.         value: opPtr  246 wordChk  w,            }END
  101.     LongAbsMode  IS{
  102.         value: opPtr ,                    }END
  103.     PCrelMode    IS{
  104.         abs: opPtr  here -  248 wordChk  w,        }END
  105.     PCindexMode  IS{
  106.         value: opPtr  247 byteChk
  107.         auxilSize: opPtr 1- 11 << or
  108.         auxReg: opPtr 12 << or
  109.         A/D: opPtr 15 << or
  110.         w,                        }END
  111.     ImmedMode    IS{
  112.         opFmt
  113.         SELECT{
  114.             Bfmt IS{  value: opPtr  249 byteChk  w,    }END
  115.             Wfmt IS{  value: opPtr  249 wordChk  w,    }END
  116.             Lfmt IS{  value: opPtr ,                }END
  117.             DEFAULT{
  118.         }SELECT
  119.                                                     }END
  120.         DEFAULT{
  121.  
  122.     }SELECT  ;
  123.  
  124.  
  125. : MODESIZE        \ ( opPtr -- size )  Returns the number of extra
  126.             \  words required for the addressing mode of the
  127.             \  passed-in operand.  The operation word itself
  128.             \  isn't counted.
  129.     -> opPtr
  130.     getpcmode: opPtr  dup 8 <
  131.     IF  drop  mode: opPtr  THEN
  132.     SELECT{
  133.         AnRelMode    IS{  1    }END
  134.         IndexMode    IS{  1    }END
  135.         ShortAbsMode    IS{  1    }END
  136.         LongAbsMode    IS{  2  }END
  137.         PCRelMode    IS{  1  }END
  138.         PCindexMode    IS{  1  }END
  139.         ImmedMode    IS{
  140.             opFmt
  141.             SELECT{
  142.                 Bfmt    IS{  1    }END
  143.                 Wfmt    IS{  1    }END
  144.                 Lfmt    IS{  2    }END
  145.                 Sfmt    IS{  2  }END
  146.                 Dfmt    IS{  4  }END
  147.                 Xfmt    IS{  6  }END
  148.                 Pfmt    IS{  6  }END
  149.                DEFAULT{  1
  150.             }SELECT
  151.                     }END
  152.         DEFAULT{  0
  153.     }SELECT  ;
  154.